package com.rachel.testjetpack;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelProvider;

import com.rachel.testjetpack.viewmodel.Main3ActivityViewModel;
import com.rachel.testjetpack.viewmodel.Main3ActivityViewModelFactory;

/**
 * Lifecycle
 * 使用Lifecycle管理生命周期
 *
 * ViewModel
 * ViewModel本身主要是一个数据维护工具。
 * 将数据维护的工作从Activity上剥离，提供一个储存数据环境，自身机制可以解决开发中，数据受Activity生命周期影响产生数据丢失的问题 (主要为横竖屏切换以及在后台被销毁)。
 * 通常结合LiveData使用。
 *
 * 之前的WorkUitl中，当屏幕旋转的时候，由于生命周期发生了改变，导致数据被销毁，所以计数器的计数又从初始值开始计数了
 * 那么我们如何解决这个问题呢？
 * 缓存呀，重写onSabeInstanceState()方法等等，都可以但是都不够优雅，优雅解决这个问题，我们的今天的主角  ViewModel。
 * 把count换成main3ActivityViewModel.count我们可以看到，在屏幕旋转之后，计数器的计数保留了，那么viewModel是如何做到的呢,这是因为ViewModel 对象存在的时间比视图或 LifecycleOwners 的特定实例存在的时间更长
 */
public class Main3Activity extends AppCompatActivity implements LifecycleOwner {
   private LifecycleRegistry lifecycleRegistry;
    private int inputCount = 100;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mian3);
        //直接调用，那么我们为什么可以在Activity中直接使用getLifecycle().addObserver(new WorkUtil());呢，其实使用的是LifecycleOwner.getLifecycle, 
        // LifecycleOwner是单一方法接口，表示类具有 Lifecycle,而如果activity继承自AppcompatActivity或Fragment继承自androidx.fragment.app.Fragment
        // 他们本身就是一个LifecycleOwner的实例，这是AndroidX库帮我们自动完成的。
//        getLifecycle().addObserver(new WorkUtil());
        //不直接调用，自定义LifecycleOwner
        lifecycleRegistry = new LifecycleRegistry(this);

//        Main3ActivityViewModel main3ActivityViewModel = ViewModelProviders.of(this).get(Main3ActivityViewModel.class);
        Main3ActivityViewModel main3ActivityViewModel = new ViewModelProvider(this).get(Main3ActivityViewModel.class);
        getLifecycle().addObserver(new WorkUtil(main3ActivityViewModel));


        //当前计数的需求是从0开始计时，我们现在修改需求如下，使用用户输入的数字为起点开始计数，这样的话ViewModel中的count就不是0了，
        // 而是传入的参数，我们在Main3Activity中定义变量inputCount 来模拟用户输入的数字
        //我们需要借助ViewModelProvider.Factory来实现传参,千万不能直接new一个传过去，因为如果我们使用直接实例化来创建ViewModel,那么ViewModel的生命周期就受Activity的影响了
        main3ActivityViewModel = new ViewModelProvider(this,new Main3ActivityViewModelFactory(inputCount)).get(Main3ActivityViewModel.class);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }
}
